package cn.com.w.simple.demo.entity;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;


/**
 * UserDetails接口
 * <p>
 * UserDetails除了有获取权限、密码、用户名方法之外，还提供了判断用户是否已经失效、是否已经被锁定、凭证是否已失效、用户是否可用方法。
 * 这四个方法看起来很简单，但是抽象的很好，因为用户是有过期时间的，那么就需要有是否已失效；
 * 锁定是指现在不可用，但是过一会又可以使用，有一个加锁解锁的过程；
 * 用户凭证是否已失效不太常用；
 * 用户"是否可用"和"是否锁住"是两个概念，"可用"指的是这个用户是否是一种合理的状态，"锁住"是指当前用户本身是否被冻结或者其他；"可用"不代表已经"解锁"。
 * <p>
 * public interface UserDetails extends Serializable {
 *        //获取该用户的权限信息
 *        Collection<? extends GrantedAuthority> getAuthorities();
 *
 *        // 获取密码
 *        String getPassword();
 *
 *        // 获取用户名
 *        String getUsername();
 *
 *        // 判断该账户是否已失效
 *        boolean isAccountNonExpired();
 *
 *        // 判断该账户是否已被锁定
 *        boolean isAccountNonLocked();
 *
 *        // 判断该账户的凭证信息是否已失效
 *        boolean isCredentialsNonExpired();
 *
 *        // 判断该用户是否可用
 *        boolean isEnabled();
 * }
 *
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo implements UserDetails {

    /**
     * 用户编号
     */
    private String userNo;

    /**
     * 用户名称
     */
    private String userName;

    /**
     * 登录名
     */
    private String loginName;

    /**
     * 登录密码
     */
    private String loginPassword;


    public static List<UserInfo> getDefaultList() {
        List<UserInfo> resultList = new ArrayList<>();
        UserInfo userInfo1 = new UserInfo("001", "张三", "zhangsan", new BCryptPasswordEncoder().encode("123456"));
        UserInfo userInfo2 = new UserInfo("002", "李四", "lisi", new BCryptPasswordEncoder().encode("123456"));
        UserInfo userInfo3 = new UserInfo("003", "王五", "wangwu", new BCryptPasswordEncoder().encode("123456"));
        UserInfo userInfo4 = new UserInfo("004", "赵六", "zhaoliu", new BCryptPasswordEncoder().encode("123456"));
        resultList.add(userInfo1);
        resultList.add(userInfo2);
        resultList.add(userInfo3);
        resultList.add(userInfo4);
        return resultList;
    }


    /**
     * 获取该用户的权限信息
     *
     * @return
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    /**
     * 获取密码
     *
     * @return
     */
    @Override
    public String getPassword() {
        return this.loginPassword;
    }

    /**
     * 获取用户名
     *
     * @return
     */
    @Override
    public String getUsername() {
        return this.loginName;
    }

    /**
     * 判断该账户是否已失效
     *
     * @return
     */
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    /**
     * 判断该账户是否已被锁定
     *
     * @return
     */
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    /**
     * 判断该账户的凭证信息是否已失效
     *
     * @return
     */
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    /**
     * 判断该用户是否可用
     *
     * @return
     */
    @Override
    public boolean isEnabled() {
        return true;
    }

}
